﻿Imports System.Data.SqlClient

Public Class Agregar

    Private _url_Servidor As String
    Private _obje As Libreria
    Private enlace As ADODB.Connection
    Dim url_Consulta As String
    Dim resp As ADODB.Recordset = New ADODB.Recordset
    Dim direccion_planeta As String = "", txtcodi_raza = "R_001"
    Public contenido_planeta As New ArrayList()
    Public nume_defensas As Integer = 0, nume_naves = 0, nume_tropas = 0, numero_planetas = 0
    Public Shared lst As ListaDobleConOrden = New ListaDobleConOrden()
    Public Shared arreglo_direccion As Direcciones
    Dim lista_tropas As New ArrayList()
    Dim lista_naves As New ArrayList()
    Dim lista_defensas As New ArrayList()

    Sub New(ByVal url_Servidor As String, ByVal obje As Libreria)
        ' TODO: Complete member initialization 
        InitializeComponent()
        _url_Servidor = url_Servidor
        _obje = obje
        If _url_Servidor.Contains(".mdb") Then
            obje.Setdriver_access()
            enlace = obje.getEnlace()
        ElseIf _url_Servidor.Contains("sqloledb") Then
            obje.Setdriver_sql()
            enlace = obje.getEnlace()
        ElseIf _url_Servidor.Contains("MySQL") Then
            obje.Setdriver_mysql()
            enlace = obje.getEnlace()
        End If
        CargarRazas()
    End Sub

    Private Sub btnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGuardar.Click
        ACTUALIZA_VALORES_ED(listDirecciones.Items(listDirecciones.SelectedIndices(0)).Text)
    End Sub

    Private Sub btnEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminar.Click

    End Sub

    Private Sub btnAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAgregar.Click
        Try
            If listDirecciones.Items.Count < 5 Then
                Dim direccion As String = InputBox("Ingrese Direccion", "Titulo")
                Console.WriteLine(DIRE_LIBRE(direccion))
                Console.WriteLine(Not direccion = "")
                If Not direccion = "" And DIRE_LIBRE(direccion) Then
                    listDirecciones.Items.Add(direccion)
                    If listDirecciones.Items.Count = 1 Then
                        Activar_Contenedor(Tropas)
                        Activar_Contenedor(Naves)
                        Activar_Contenedor(Defensas)
                        'Seleccionar primer elemento
                    End If
                    'Agregar estructura dinamica
                    contenido_planeta.Add(direccion) 'el planeta sera la cabecera
                    For i As Integer = 1 To (nume_defensas + nume_naves + nume_tropas + 1) - 1
                        contenido_planeta.Add("0") 'valor inicial de las unidades es 0
                    Next
                    IngresaDatos(direccion, contenido_planeta)
                    lst.agrega(arreglo_direccion)

                Else
                    MessageBox.Show(Nothing, "Direccion vacia o ya usada", "Advertencia")
                    Return 'Regresa a la instruccion inicial
                End If
            Else
                Console.WriteLine("acabo")
            End If
        Catch es As Exception
            MessageBox.Show(Nothing, "Agrege algo a la direccion", "Error")

        End Try

    End Sub

    Private Sub CargarRazas()
        If enlace IsNot Nothing Then
            Try
                url_Consulta = "SELECT nomb_raza FROM Razas"
                resp = enlace.Execute(url_Consulta)
                While resp.EOF <> True
                    ComboRaza.Items.Add(resp.Fields(0).Value)
                    resp.MoveNext()
                End While

            Catch ex As SqlException
                Console.WriteLine(ex.ErrorCode)
            End Try

        End If
    End Sub

    Private Function DIRE_LIBRE(ByVal direccion As String) As Boolean
        Dim retorno As Boolean = True
        Try
            url_Consulta = "select Numero_direccion from `Direcciones` where Numero_direccion='" & direccion & "'"
            resp = enlace.Execute(url_Consulta)
            While resp.EOF <> True
                retorno = False
                resp.MoveNext()
            End While
        Catch ex As SqlException
            Console.WriteLine(ex.ErrorCode)
        End Try
        Return retorno
    End Function

    Private Sub IngresaDatos(ByVal direccion As String, ByVal contenido_planeta As ArrayList)
        arreglo_direccion = New Direcciones()
        arreglo_direccion.setContenido(contenido_planeta)
        arreglo_direccion.setNombre(direccion)

    End Sub

    Private Sub Activar_Contenedor(ByVal tabPage As TabPage)
        Dim Control As Control
        For Each Control In tabPage.Controls
            Control.Enabled = True
        Next
    End Sub
    Private Sub Desactivar_Contenedor(ByVal tabPage As TabPage)
        Dim Control As Control
        For Each Control In tabPage.Controls
            Control.Enabled = False
        Next
    End Sub

    Private Sub listDirecciones_ItemSelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.ListViewItemSelectionChangedEventArgs) Handles listDirecciones.ItemSelectionChanged
        For i As Integer = 0 To listDirecciones.SelectedIndices.Count - 1
            Console.WriteLine(listDirecciones.Items(listDirecciones.SelectedIndices(0)).Text)
            LLAMAR_VALORES_ED(listDirecciones.Items(listDirecciones.SelectedIndices(0)).Text)
        Next i
    End Sub

    Private Sub LLAMAR_VALORES_ED(ByVal valor As String)
        Dim auxiliar As NodoDoble = lst.busca(valor)
        Dim temporal As New ArrayList()
        If Not IsNothing(auxiliar) Then
            arreglo_direccion = auxiliar.getNodo()
            temporal = arreglo_direccion.getContenido()
            For i As Integer = 0 To nume_tropas - 1
                Dim cajatexto As String = temporal.Item(i + 1).ToString
                Tropas.Controls(i * 2 + 1).Text = cajatexto
            Next

            For i As Integer = 0 To nume_naves - 1
                Dim cajatexto As String = temporal.Item(i + nume_tropas + 1).ToString
                Naves.Controls(i * 2 + 1).Text = cajatexto
            Next

            For i As Integer = 0 To nume_defensas - 1
                Dim cajatexto As String = temporal.Item(i + nume_tropas + nume_naves + 1).ToString
                Defensas.Controls(i * 2 + 1).Text = cajatexto
            Next

        End If
    End Sub
    Private Sub LIMPIAR_PANELES()
        Tropas.Controls.Clear()
        Naves.Controls.Clear()
        Defensas.Controls.Clear()
    End Sub
    Private Sub ComboRaza_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboRaza.SelectedValueChanged
        Console.WriteLine("cambio" & ComboRaza.SelectedItem)
        listDirecciones.Items.Clear()
        lst.setInicio(Nothing)
        LIMPIAR_PANELES()
        Asignar_codi_raza(ComboRaza.SelectedItem.ToString)
        RECARGAR_TROPAS()
        RECARGAR_NAVES()
        RECARGAR_DEFENSAS()
        Desactivar_Contenedor(Tropas)
        Desactivar_Contenedor(Naves)
        Desactivar_Contenedor(Defensas)
    End Sub

    Private Sub Asignar_codi_raza(ByVal p1 As String)
        If enlace IsNot Nothing Then
            Try
                url_Consulta = "select * from Razas where Razas.nomb_raza ='" & p1 & "'"
                resp = enlace.Execute(url_Consulta)
                While resp.EOF <> True
                    txtcodi_raza = (resp.Fields(0).Value.ToString)
                    numero_planetas = CInt(resp.Fields(3).Value)
                    resp.MoveNext()
                End While

            Catch ex As SqlException
                Console.WriteLine(ex.ErrorCode)
            End Try
        End If
    End Sub

    Private Sub RECARGAR_NAVES()
        If enlace IsNot Nothing Then
            Try
                url_Consulta = "select * from Naves where codi_raza = '" & txtcodi_raza & "'"
                resp = enlace.Execute(url_Consulta)
                Dim lista As New ArrayList()
                Dim alto_panel = Naves.Height
                While resp.EOF <> True
                    lista.Add(resp.Fields(0).Value)
                    resp.MoveNext()
                End While
                nume_naves = lista.Count
                lista_naves = lista
                Dim espaciado As Integer = CInt((alto_panel / lista.Count) + 1)
                Crear_Objetos(espaciado, Naves, lista)
            Catch ex As SqlException
                Console.WriteLine(ex.ErrorCode)
            End Try
        End If
    End Sub

    Private Sub RECARGAR_TROPAS()
        If enlace IsNot Nothing Then
            Try
                url_Consulta = "select * from Tropas where codi_raza = '" & txtcodi_raza & "'"
                resp = enlace.Execute(url_Consulta)
                Dim lista As New ArrayList()
                Dim alto_panel = Naves.Height
                While resp.EOF <> True
                    lista.Add(resp.Fields(0).Value)
                    resp.MoveNext()
                End While
                nume_tropas = lista.Count
                lista_tropas = lista
                Dim espaciado As Integer = CInt((alto_panel / lista.Count) + 1)
                Crear_Objetos(espaciado, Tropas, lista)
            Catch ex As SqlException
                Console.WriteLine(ex.ErrorCode)
            End Try
        End If
    End Sub

    Private Sub RECARGAR_DEFENSAS()
        If enlace IsNot Nothing Then
            Try
                url_Consulta = "select * from Defensas where codi_raza = '" & txtcodi_raza & "'"
                resp = enlace.Execute(url_Consulta)
                Dim lista As New ArrayList()
                Dim alto_panel = Naves.Height
                While resp.EOF <> True
                    lista.Add(resp.Fields(0).Value)
                    resp.MoveNext()
                End While
                nume_defensas = lista.Count
                lista_defensas = lista
                Dim espaciado As Integer = CInt((alto_panel / lista.Count) + 1)
                Crear_Objetos(espaciado, Defensas, lista)
            Catch ex As SqlException
                Console.WriteLine(ex.ErrorCode)
            End Try
        End If
    End Sub

    Private Sub Crear_Objetos(ByVal espaciado As Integer, ByVal panel_padre As TabPage, ByVal lista As ArrayList)
        Dim etiketa(0 To lista.Count - 1) As Label
        Dim objetos_texto(0 To espaciado - 1) As TextBox
        For i As Integer = 0 To lista.Count - 1
            etiketa(i) = New Label()
            etiketa(i).Text = lista.Item(i).ToString
            panel_padre.Controls.Add(etiketa(i))

            objetos_texto(i) = New TextBox()
            panel_padre.Controls.Add(objetos_texto(i))
            objetos_texto(i).Text = ("")

            objetos_texto(i).SetBounds(300, 5 + espaciado * i, 50, 20)
            etiketa(i).SetBounds(20, 5 + espaciado * i, 150, 20)

        Next
    End Sub

    Private Sub ACTUALIZA_VALORES_ED(ByVal cadena As String)
        Console.WriteLine("cargado" & cadena)
        Dim temporal As New ArrayList()
        temporal.Add(cadena)
        For i As Integer = 0 To nume_tropas - 1
            Dim valor_caja_texto As String = (Tropas.Controls(i * 2 + 1)).Text().Trim() 'txt del panel tropas
            Console.WriteLine("tropas " & valor_caja_texto)
            temporal.Add(valor_caja_texto)
        Next

        For i As Integer = 0 To nume_naves - 1
            Dim valor_caja_texto As String = (Naves.Controls(i * 2 + 1)).Text().Trim() 'txt del panel tropas
            Console.WriteLine("naves " & valor_caja_texto)
            temporal.Add(valor_caja_texto)
        Next

        For i As Integer = 0 To nume_defensas - 1
            Dim valor_caja_texto As String = (Defensas.Controls(i * 2 + 1)).Text().Trim() 'txt del panel tropas
            Console.WriteLine("defensas " & valor_caja_texto)
            temporal.Add(valor_caja_texto)
        Next
        'busca el dato para actualizar valores
        Dim auxiliar As NodoDoble = lst.busca(cadena)
        If auxiliar IsNot Nothing Then
            ' no lo encontró
            arreglo_direccion = auxiliar.getNodo()
            arreglo_direccion.setContenido(temporal)
            For i As Integer = 1 To temporal.Count - 1
                Console.WriteLine("valores cargados " & temporal.Item(i))
            Next

        End If
        'Guarda informacion de paneles
    End Sub

    Private Sub btnRegistrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegistrar.Click
        ' ejecutar consulta
        'Registrar usuario y raza
        Registraruser_raza(txtUser.Text().Trim(), ComboRaza.SelectedItem.ToString)
        'Registrar planetas
        Registrar_user_planetas(txtUser.Text().Trim())
        Registrar_unidades_planetas()
        ESTADO_BOTONES_H_NH(False)
        btnCancelar.Text = "Salir"
        lst.setInicio(Nothing)

    End Sub

    Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click
        Dispose()
    End Sub

    Private Sub Registrar_unidades_planetas()
        Try
            'String direccion_actual = listDirecciones.getSelectedValue().toString();
            'System.out.println(direccion_actual);
            Dim usuario As String = txtUser.Text().Trim()
            'hacer consulta
            'llamar nombre de usuario
            'llamar cada direccion en la ED
            Dim auxiliar As NodoDoble = lst.getInicio()
            While auxiliar IsNot Nothing
                Dim temp As ArrayList = auxiliar.getNodo().getContenido()
                For i As Integer = 1 To temp.Count - 1
                    If i <= lista_tropas.Count Then
                        Try
                            url_Consulta = "INSERT INTO usuario_numero_tropas " & "(nomb_usuarios, nomb_tropas, cantidad_trop, numero_Direccion) " & "VALUES ('" & usuario & "', '" & (Tropas.Controls((i - 1) * 2)).Text().Trim() & "', '" & temp.Item(i) & "', '" & temp.Item(0) & "')"
                            'System.out.println(url_consulta);
                            enlace.Execute(url_Consulta)

                        Catch ex As SqlException

                        End Try

                    ElseIf i > lista_tropas.Count AndAlso i <= (lista_naves.Count + lista_tropas.Count) Then
                        Try
                            url_Consulta = "INSERT INTO usuario_numero_naves " & "(nomb_usuarios, Nomb_Naves, cantidad_nav, numero_Direccion) " & "VALUES ('" & usuario & "', '" & (Naves.Controls((i - 1 - lista_tropas.Count) * 2)).Text().Trim() & "', '" & temp.Item(i) & "', '" & temp.Item(0) & "')"
                            'System.out.println(url_consulta);
                            enlace.Execute(url_Consulta)

                        Catch ex As SqlException

                        End Try

                    ElseIf i > (lista_naves.Count + lista_tropas.Count) Then
                        Try
                            url_Consulta = "INSERT INTO usuario_numero_Defensas " & "(nomb_usuarios, nomb_Defensas, cantidad_def, numero_Direccion) " & "VALUES ('" & usuario & "', '" & (Defensas.Controls((i - 1 - lista_tropas.Count - lista_naves.Count) * 2)).Text().Trim() & "', '" & temp.Item(i) & "', '" & temp.Item(0) & "')"
                            'System.out.println(url_consulta);
                            enlace.Execute(url_Consulta)

                        Catch ex As SqlException

                        End Try

                    End If

                Next
                auxiliar = auxiliar.getApuntSgte()

            End While
            'por cada direccion hacer una consulta de insert
        Catch e As Exception
            'error

        End Try

    End Sub

    Private Sub ESTADO_BOTONES_H_NH(ByVal estado_final As Boolean)
        btnRegistrar.Enabled = (estado_final)
        btnAgregar.Enabled = (estado_final)
        btnEliminar.Enabled = (estado_final)
        btnGuardar.Enabled = (estado_final)
        listDirecciones.Enabled = (estado_final)
        ComboRaza.Enabled = (estado_final)

    End Sub

    Private Sub Registrar_user_planetas(ByVal usuario As String)
        If enlace IsNot Nothing Then
            For i As Integer = 0 To listDirecciones.Items.Count - 1
                Try
                    'System.out.println(modelo.getElementAt(i)); 'LISTAR PLANETAS
                    url_Consulta = "INSERT INTO Direcciones (Numero_direccion, Galaxia, nomb_usuarios) VALUES ('" & listDirecciones.Items(i).Text.Trim & "', '" & Deducir_galaxia(listDirecciones.Items(i).Text.Trim) & "', '" & usuario & "')"
                    enlace.Execute(url_Consulta)
                Catch ex As SqlException
                    MessageBox.Show(Nothing, "La direccion ya esta usada eliminela y elija otra", "titulo")
                End Try
            Next

        End If
    End Sub

    Private Sub Registraruser_raza(ByVal txtuser As String, ByVal txtraza As String)
        'consultar usuario si esuq esta registrado
        Asignar_codi_raza(ComboRaza.SelectedItem.ToString)
        If Buscar_BD(txtuser) <> True Then
            If enlace IsNot Nothing Then
                Try
                    url_Consulta = "INSERT INTO usuarios (nomb_usuarios, codi_raza) VALUES ('" & txtuser & "', '" & txtcodi_raza & "')"
                    enlace.Execute(url_Consulta)

                Catch ex As SqlException

                End Try

            End If

            'registrar usuario
            Console.WriteLine("registrar " & txtuser & " " & txtraza)

        Else
            MessageBox.Show(Nothing, "Usuario ya registrado", "Titulo")
            Console.WriteLine("error")
            'mensaje de error

        End If


    End Sub

    Private Function Deducir_galaxia(ByVal direccion As String) As String
        Dim nombre_galaxia As String = ""
        Dim primeraletra As Char = direccion.Chars(0)
        'Console.WriteLine(primeraletra)
        If primeraletra = "P".Chars(0) Then
            nombre_galaxia = "Pegasus"
        ElseIf primeraletra = "A".Chars(0) Then
            nombre_galaxia = "Andrómeda"
        ElseIf primeraletra = "M".Chars(0) Then
            nombre_galaxia = "Midway"
        ElseIf primeraletra = "V".Chars(0) Then
            nombre_galaxia = "Vía Láctea"
        End If
        Return nombre_galaxia
    End Function

    Private Function Buscar_BD(ByVal txtuser As String) As Boolean
        Dim estado As Boolean = False
        If enlace IsNot Nothing Then
            Try
                url_Consulta = "Select nomb_usuarios from usuarios where nomb_usuarios = '" & txtuser & "'"
                resp = enlace.Execute(url_Consulta)
                While resp.EOF <> True
                    Dim origen As String = resp.Fields(0).Value.ToString
                    'System.out.println(" origen " &  origen);
                    If origen.Equals(txtuser) Then
                        estado = True
                    End If
                    resp.MoveNext()
                End While

            Catch ex As SqlException
                'System.out.println("No se encunetra registrado");

            End Try

        End If
        Return estado
    End Function
    Private Sub BusquedaAproximada(ByVal texto As String)
        If Buscar_BD(texto) = True Then
            'System.out.println("encontrado");
            Validacion.Load("invalido.png")
            ESTADO_BOTONES_H_NH(False)

        Else
            'System.out.println("no encontrado");
            Validacion.Load("valido.png")
            ESTADO_BOTONES_H_NH(True)

        End If


    End Sub

    Private Sub txtUser_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtUser.TextChanged
        Console.WriteLine(txtUser.Text)
        BusquedaAproximada(txtUser.Text)
    End Sub
End Class